const qiniu = require('qiniu');
const config = require('../config/qiniu');
const crypto = require('crypto');

/**
 * 七牛云服务工具
 */
const qiniuService = {
  /**
   * 生成上传凭证
   * @param {string} type - 文件类型，如 'image', 'video' 等
   * @returns {object} - 上传凭证信息
   */
  generateUploadToken(type) {
    // 检查文件类型是否有效
    if (!config.allowedTypes.includes(type)) {
      throw new Error(`不支持的文件类型: ${type}`);
    }

    // 获取对应的存储空间配置
    const bucketConfig = config[type] || config.default;
    const mac = new qiniu.auth.digest.Mac(config.accessKey, config.secretKey);
    
    // 生成随机文件名
    const timestamp = Date.now();
    const random = Math.floor(Math.random() * 10000);
    const key = `${type}/${timestamp}_${random}.${bucketConfig.ext}`;
    
    // 设置上传策略
    const options = {
      scope: `${bucketConfig.bucket}:${key}`,
      returnBody: JSON.stringify({
        key: '$(key)',
        hash: '$(etag)',
        url: `${bucketConfig.domain}$(key)`
      }),
      expires: 3600 // 凭证有效期：1小时
    };
    
    const putPolicy = new qiniu.rs.PutPolicy(options);
    const uploadToken = putPolicy.uploadToken(mac);
    
    return {
      token: uploadToken,
      key,
      domain: bucketConfig.domain
    };
  },
  
  /**
   * 从URL中提取文件名
   * @param {string} url - 七牛云URL
   * @returns {string|null} - 文件名，如果URL无效则返回null
   */
  getKeyFromUrl(url) {
    if (!url) return null;
    
    // 检查URL是否来自配置的域名
    const isValidDomain = Object.values(config).some(conf => {
      return conf.domain && url.startsWith(conf.domain);
    });
    
    if (!isValidDomain) return null;
    
    // 从URL中提取文件名
    try {
      const urlObj = new URL(url);
      return urlObj.pathname.substring(1); // 去除开头的斜杠
    } catch (e) {
      return null;
    }
  },
  
  /**
   * 验证URL是否为有效的七牛云URL
   * @param {string} url - 要验证的URL
   * @returns {boolean} - 是否为有效的七牛云URL
   */
  isValidQiniuUrl(url) {
    if (!url || typeof url !== 'string') return false;
    
    // 检查URL是否来自配置的域名
    return Object.values(config).some(conf => {
      return conf.domain && url.startsWith(conf.domain);
    });
  },
  
  /**
   * 删除文件
   * @param {string} url - 七牛云URL
   * @returns {Promise<boolean>} - 是否删除成功
   */
  async deleteFile(url) {
    const key = this.getKeyFromUrl(url);
    if (!key) return false;
    
    // 确定文件类型和对应的存储空间
    let bucketName = null;
    for (const type of config.allowedTypes) {
      if (key.startsWith(`${type}/`)) {
        bucketName = config[type]?.bucket || config.default.bucket;
        break;
      }
    }
    
    if (!bucketName) return false;
    
    const mac = new qiniu.auth.digest.Mac(config.accessKey, config.secretKey);
    const config2 = new qiniu.conf.Config();
    const bucketManager = new qiniu.rs.BucketManager(mac, config2);
    
    return new Promise((resolve, reject) => {
      bucketManager.delete(bucketName, key, (err) => {
        if (err) {
          console.error('七牛云删除文件失败:', err);
          resolve(false);
        } else {
          resolve(true);
        }
      });
    });
  }
};

module.exports = qiniuService; 